package com.xauto.pioneer.appuser;

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.media.AudioManager;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.tts.auth.AuthInfo;
import com.baidu.tts.chainofresponsibility.logger.LoggerProxy;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.TtsMode;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.tencent.bugly.crashreport.CrashReport;
import com.umeng.socialize.Config;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.utils.Log;
import com.xauto.pioneer.appuser.http.Constants;
import com.xauto.pioneer.appuser.model.LinkInfo;
import com.xauto.pioneer.appuser.util.DataCheckUtil;
import com.xauto.pioneer.appuser.util.ScreenUtils;

import net.tsz.afinal.FinalBitmap;
import net.tsz.afinal.FinalDb;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;

/**
 * Application
 * Created by Lemon on 2016/5/27.
 */
public class MyApplication extends Application {

    private static final String TAG = "MyApplication";
    private static FinalDb.DaoConfig daoConfig;
    public static Context applicationContext;
    /**
     * nickname for current user, the nickname instead of ID be shown when user receive notification from APNs
     */
    public static String currentUserNick = "";

//    /** 存储推送信息*/
//    private static LinkInfo linkInfo;
    private static boolean is_notify;
    private static MyApplication instance;
    public static MyApplication getInstance() {
        return instance;
    }

    public static String getCurrentUserNick() {
        return currentUserNick;
    }

    public static void setCurrentUserNick(String currentUserNick) {
        MyApplication.currentUserNick = currentUserNick;
    }
    //-------------------语音---------------------------------------
    protected String appId = "11040179";
    protected String appKey = "ZmbNwzAtLDDEtse5klGDQ3C2";
    protected String secretKey = "57eae0bf953e936a97646ab490282266";
    private static final String TEXT = "欢迎使用百度语音合成，请在代码中修改合成文本";

    // TtsMode.MIX; 离在线融合，在线优先； TtsMode.ONLINE 纯在线； 没有纯离线
    private TtsMode ttsMode = TtsMode.ONLINE;

    // ================选择TtsMode.ONLINE  不需要设置以下参数; 选择TtsMode.MIX 需要设置下面2个离线资源文件的路径
    private static final String TEMP_DIR = "/sdcard/baiduTTS"; // 重要！请手动将assets目录下的3个dat 文件复制到该目录

    // 请确保该PATH下有这个文件
    private static final String TEXT_FILENAME = TEMP_DIR + "/" + "bd_etts_text.dat";

    // 请确保该PATH下有这个文件 ，m15是离线男声
    private static final String MODEL_FILENAME =
            TEMP_DIR + "/" + "bd_etts_common_speech_m15_mand_eng_high_am-mix_v3.0.0_20170505.dat";

    // ===============初始化参数设置完毕，更多合成参数请至getParams()方法中设置 =================

    public SpeechSynthesizer mSpeechSynthesizer;
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        applicationContext = this;
        //--------百度语音
        initTTs();
        //初始化bugly
        CrashReport
                .initCrashReport(getApplicationContext(), "308a97c37c", true);
        // 在使用 SDK 各组间之前初始化 context 信息，传入 ApplicationContext
        SDKInitializer.initialize(this);
//        setJPushAlias(PreferencesUtils.getString(instance, Constants.KEY_TOKEN));
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true).cacheOnDisk(true)
                .resetViewBeforeLoading(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .showImageOnLoading(R.mipmap.ic_map_car_blue)
                .showImageForEmptyUri(R.mipmap.ic_map_car_blue)
                .showImageOnFail(R.mipmap.ic_map_car_blue).build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .memoryCache(new WeakMemoryCache())
                 .memoryCache(new WeakMemoryCache()).memoryCacheSize(2 * 1024 * 1024)
//                .diskCache(new UnlimitedDiscCache(getExternalFilesDir("/cache")))
                .denyCacheImageMultipleSizesInMemory()
                .diskCacheExtraOptions(480, 320, null).writeDebugLogs().build();
        ImageLoader.getInstance().init(config);

        //微信 appid appsecret
        PlatformConfig.setWeixin(Constants.WX_APP_ID, "051af1e98726669537935d58eae11ea8");

        //新浪微博 appkey appsecret
        PlatformConfig.setSinaWeibo(getApplicationContext().getString(R.string.share_sina_id),
                getApplicationContext().getString(R.string.share_sina_key), "http://sns.whalecloud.com/sina2/callback");

         //QQ appid appkey
        PlatformConfig.setQQZone("1105528352", "5m6zOEXX1NxaEFlw");

        //支付宝 appid
         PlatformConfig.setAlipay("2015111700822536");

        Config.DEBUG = true;
        Log.LOG = true;
        Config.isJumptoAppStore = true; //对应平台没有安装的时候跳转转到应用商店下载; 其中qq 微信会跳转到下载界面进行下载，其他应用会跳到应用商店进行下载
        UMShareAPI.get(this);
        //初始化 JPush
        JPushInterface.setDebugMode(true); 	// 设置开启日志,发布时请关闭日志
        JPushInterface.init(this);
//        // 在主进程设置信鸽相关的内容
//        if (isMainProcess()) {
//            // 为保证弹出通知前一定调用本方法，需要在application的onCreate注册
//            // 收到通知时，会调用本回调函数。
//            // 相当于这个回调会拦截在信鸽的弹出通知之前被截取
//            // 一般上针对需要获取通知内容、标题，设置通知点击的跳转逻辑等等
//            XGPushManager.setNotifactionCallback(new XGPushNotifactionCallback() {
//
//                @Override
//                public void handleNotify(XGNotifaction xGNotifaction) {
//                    Log.e("test", "处理信鸽通知：" + xGNotifaction);
//                    // 获取标签、内容、自定义内容
//                    String title = xGNotifaction.getTitle();
//                    String content = xGNotifaction.getContent();
//                    String customContent = xGNotifaction
//                            .getCustomContent();
//                    // 其它的处理
//                    // 如果还要弹出通知，可直接调用以下代码或自己创建Notifaction，否则，本通知将不会弹出在通知栏中。
//                    if (!StringUtils.isBlank(customContent)) {
//                        try {
//                            JSONObject jsonObject = new JSONObject(customContent);
//                            if (!StringUtils.isBlank(jsonObject.optString("type"))
//                                    && jsonObject.optString("type").equals("2")) {
//                                //透传
//                                if (!StringUtils.isBlank(jsonObject.optString("is_notify"))) {
//                                    is_notify = jsonObject.optString("is_notify").equals("1");
//                                    Intent intent = new Intent("cn.suniey.oye.xg.message");
//                                    applicationContext.sendBroadcast(intent);
//                                }
//                                return;
//                            }
//                        } catch (JSONException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                    xGNotifaction.doNotify();
//                }
//            });
//        }
    }
    //  下面是UI部分


    /**
     * 注意此处为了说明流程，故意在UI线程中调用。
     * 实际集成中，该方法一定在新线程中调用，并且该线程不能结束。具体可以参考NonBlockSyntherizer的写法
     */
    private void initTTs() {
        LoggerProxy.printable(true); // 日志打印在logcat中
        boolean isMix = ttsMode.equals(TtsMode.MIX);
        boolean isSuccess;
        if (isMix) {
            // 检查2个离线资源是否可读
            isSuccess = checkOfflineResources();
            if (!isSuccess) {
                return;
            } else {
                Log.e("离线资源存在并且可读, 目录：" + TEMP_DIR);
            }
        }
        // 日志更新在UI中，可以换成MessageListener，在logcat中查看日志
        //SpeechSynthesizerListener listener = new UiMessageListener(mainHandler);

        // 1. 获取实例
        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        mSpeechSynthesizer.setContext(this);

        // 2. 设置listener
        //mSpeechSynthesizer.setSpeechSynthesizerListener(listener);

        // 3. 设置appId，appKey.secretKey
        int result = mSpeechSynthesizer.setAppId(appId);
        checkResult(result, "setAppId");
        result = mSpeechSynthesizer.setApiKey(appKey, secretKey);
        checkResult(result, "setApiKey");

        // 4. 支持离线的话，需要设置离线模型
        if (isMix) {
            // 检查离线授权文件是否下载成功，离线授权文件联网时SDK自动下载管理，有效期3年，3年后的最后一个月自动更新。
            isSuccess = checkAuth();
            if (!isSuccess) {
                return;
            }
            // 文本模型文件路径 (离线引擎使用)， 注意TEXT_FILENAME必须存在并且可读
            mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, TEXT_FILENAME);
            // 声学模型文件路径 (离线引擎使用)， 注意TEXT_FILENAME必须存在并且可读
            mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, MODEL_FILENAME);
        }

        // 5. 以下setParam 参数选填。不填写则默认值生效
        // 设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
        // 设置合成的音量，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");
        // 设置合成的语速，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");
        // 设置合成的语调，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");

        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);
        // 该参数设置为TtsMode.MIX生效。即纯在线模式不生效。
        // MIX_MODE_DEFAULT 默认 ，wifi状态下使用在线，非wifi离线。在线状态下，请求超时6s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi状态下使用在线，非wifi离线。在线状态下， 请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_NETWORK ， 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线

        mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);

        // x. 额外 ： 自动so文件是否复制正确及上面设置的参数
        Map<String, String> params = new HashMap<>();
        // 复制下上面的 mSpeechSynthesizer.setParam参数
        // 上线时请删除AutoCheck的调用
        if (isMix) {
            params.put(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, TEXT_FILENAME);
            params.put(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, MODEL_FILENAME);
        }
       // InitConfig initConfig =  new InitConfig(appId, appKey, secretKey, ttsMode, params, listener);
        // 6. 初始化
        result = mSpeechSynthesizer.initTts(ttsMode);
        checkResult(result, "initTts");

    }
    /**
     * 检查appId ak sk 是否填写正确，另外检查官网应用内设置的包名是否与运行时的包名一致。本demo的包名定义在build.gradle文件中
     *
     * @return
     */
    private boolean checkAuth() {
        AuthInfo authInfo = mSpeechSynthesizer.auth(ttsMode);
        if (!authInfo.isSuccess()) {
            // 离线授权需要网站上的应用填写包名。本demo的包名是com.baidu.tts.sample，定义在build.gradle中
            String errorMsg = authInfo.getTtsError().getDetailMessage();
            Log.e("验证通过，离线正式授权文件存在。");
            return false;
        } else {
            Log.e("验证通过，离线正式授权文件存在。");
            return true;
        }
    }
    /**
     * 检查 TEXT_FILENAME, MODEL_FILENAME 这2个文件是否存在，不存在请自行从assets目录里手动复制
     *
     * @return
     */
    private boolean checkOfflineResources() {
        String[] filenames = {TEXT_FILENAME, MODEL_FILENAME};
        for (String path : filenames) {
            File f = new File(path);
            if (!f.canRead()) {
                Log.e("[ERROR] 文件不存在或者不可读取，请从assets目录复制同名文件到：" + path);
                Log.e("[ERROR] 初始化失败！！！");
                return false;
            }
        }
        return true;
    }

    public void speak() {
        /* 以下参数每次合成时都可以修改
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
         *  设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "5"); 设置合成的音量，0-9 ，默认 5
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5"); 设置合成的语速，0-9 ，默认 5
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5"); 设置合成的语调，0-9 ，默认 5
         *
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);
         *  MIX_MODE_DEFAULT 默认 ，wifi状态下使用在线，非wifi离线。在线状态下，请求超时6s自动转离线
         *  MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi状态下使用在线，非wifi离线。在线状态下， 请求超时1.2s自动转离线
         *  MIX_MODE_HIGH_SPEED_NETWORK ， 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
         *  MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
         */

        if (mSpeechSynthesizer == null) {
            Log.e("[ERROR], 初始化失败");
            return;
        }
        mSpeechSynthesizer.speak(TEXT);
    }
    private void checkResult(int result, String method) {
        if (result != 0) {
            Log.e("error code :" + result + " method:" + method + ", 错误码文档:http://yuyin.baidu.com/docs/tts/122 ");
        }
    }
    public boolean isMainProcess() {
        ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
        List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
        String mainProcessName = getPackageName();
        int myPid = android.os.Process.myPid();
        for (ActivityManager.RunningAppProcessInfo info : processInfos) {
            if (info.pid == myPid && mainProcessName.equals(info.processName)) {
                return true;
            }
        }
        return false;
    }

    /***
     * 配置FinalDB
     * @param mContext 上下文
     * @return
     */
    public static FinalDb.DaoConfig getFinalDbConfig(Context mContext) {
        if(daoConfig == null) {
            daoConfig = new FinalDb.DaoConfig();
            daoConfig.setContext(mContext);
            daoConfig.setDbName("pioneer.db");
            daoConfig.setDebug(true);
            daoConfig.setTargetDirectory(Constants.FILE_PATH);
        }
        return daoConfig;
    }

    public static FinalBitmap getDefaultFinalBitmap(Context context) {
        FinalBitmap finalBitmap = FinalBitmap.create(context);
        finalBitmap.configLoadfailImage(R.mipmap.default_image);
        finalBitmap.configLoadingImage(R.mipmap.default_image);
        return finalBitmap;
    }

    /**
     * @param context
     * @param r
     * @param  defaultImgRes:默认图片资源
     * @return
     */
    public static DisplayImageOptions getDisplayImageOptions(Context context, int r, int defaultImgRes) {
        return new DisplayImageOptions.Builder()
                .displayer(
                        new RoundedBitmapDisplayer(ScreenUtils.dpToPxInt(
                                context, r))).cacheInMemory(true)
                .cacheOnDisk(true).resetViewBeforeLoading(true)
                .showImageOnLoading(defaultImgRes)
                .showImageOnFail(defaultImgRes)
                .showImageForEmptyUri(defaultImgRes)
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)//IN_SAMPLE_POWER_OF_2
                .bitmapConfig(Bitmap.Config.RGB_565).build();
    }

    /**
     * @param  defaultImgRes:默认图片资源
     * @return
     */
    public static DisplayImageOptions getDisplayImageOptions(int defaultImgRes) {
        return new DisplayImageOptions.Builder()
                .cacheOnDisk(true).resetViewBeforeLoading(true)
                .showImageOnLoading(defaultImgRes)
                .showImageOnFail(defaultImgRes)
                .showImageForEmptyUri(defaultImgRes)
                .imageScaleType(ImageScaleType.NONE)//IN_SAMPLE_POWER_OF_2
                .bitmapConfig(Bitmap.Config.ARGB_8888).build();
    }

    /**
     * 设置推送别名
     */
    public static  void  setJPushAlias(String alias){
        if (!DataCheckUtil.isLogin(instance))return;
        JPushInterface.setAliasAndTags(instance, alias, null, new TagAliasCallback() {
            @Override
            public void gotResult(int i, String s, Set<String> set) {

            }
        });
    }

    /** 存储推送信息*/
    private static LinkInfo linkInfo;

    /***** 保存跳转信息 *****/
    public static void saveLinkInfo(LinkInfo info) {
        linkInfo = info;
    }

    public static void deleteLinkInfo() {
        linkInfo = null;
    }

    public static LinkInfo getLinkInfo() {
        return linkInfo;
    }

}
